#include <head.h>

//工序信号量
sem_t sem;

// 工序A
void *process_A(void *arg);

// 工序B
void *process_B(void *arg);

// 工序C
void *process_C(void *arg);

int main(int argc, char const *argv[])
{
    int __errnum;        //错误码
    // 初始化工序信号
    sem_init(&sem, 0, 1);

    // 工序线程tid
    pthread_t Tid[3];

    // 创建线程

    if (0 != (__errnum = pthread_create(&Tid[0], NULL, process_A, NULL)))
    {
        printf("pthread_create error: %d %s\n", __errnum, strerror(__errnum));
    }

    if (0 != (__errnum = pthread_create(&Tid[1], NULL, process_B, NULL)))
    {
        printf("pthread_create error: %d %s\n", __errnum, strerror(__errnum));
    }

    if (0 != (__errnum = pthread_create(&Tid[2], NULL, process_C, NULL)))
    {
        printf("pthread_create error: %d %s\n", __errnum, strerror(__errnum));
    }

    // 回收线程
    pthread_join(Tid[0], NULL);
    pthread_join(Tid[1], NULL);
    pthread_join(Tid[2], NULL);

    // 释放工序信号
    sem_destroy(&sem);
    return 0;
}

// 工序A
void *process_A(void *arg)
{
    //  对信号量进行 P 操作，等待信号量大于 0 并对其减 1
    sem_wait(&sem);
    sleep(2); // 模拟工序A时间
    printf("工程进度 :A\n");
    // 对信号量进行 V 操作，增加信号量的值
    sem_post(&sem);
    return NULL;
}

// 工序B
void *process_B(void *arg)
{
    // P操作
    sem_wait(&sem);
    sleep(2); // 模拟工序B时间
    printf("工程进度 :A->B\n");
    // v操作
    sem_post(&sem);
    return NULL;
}

// 工序C
void *process_C(void *arg)
{
    // P操作
    sem_wait(&sem);
    sleep(2); // 模拟工序C时间
    printf("工程进度 :A->B->C\n");
    // v操作
    sem_post(&sem);
    return NULL;
}
